rCore

您所在的位置:网站首页 arm risc-v 多核 rCore

rCore

2024-07-12 04:06| 来源: 网络整理| 查看: 265

rCore-N 的多核改造

在前文中,我们描述了用户态中断的机制和功能。然而基于单核环境的 rCore-Tutorial v3.5 改造的 rCore-N 并不能发挥出用户态中断的优势,所以我们需要对其进行多核改造。

多核启动 rustsbi-qemu 的多核启动

对于 SMP 架构,多核启动的一种简单方法是先启动核 0,在核 0 完成 OS 的启动后,通过某种方式“唤醒”其余的核。在 rustsbi-qemu 中,所有核在上电后都直接启动,执行到 rust_main 中的 mp_hook 函数。在 mp_hook 中,编号非 0 的核都会陷入循环,等待“M 态软件中断”来跳出循环,执行 sbi 层的初始化配置后跳转 OS。

rCore-N 的多核启动 启动栈

sbi 层完成配置后,首先进入一段汇编进行启动栈的配置,再跳转 rust 编写的内核初始化函数 rust_main。我们使用 4 核的 SMP 架构,每个核有 64KiB 的启动栈,即在 .bss.stack 段共有 256KiB 的空间用于 OS 的启动。此段根据核的 id,地址从低到高进行分配。

初始化

OS 的初始化分为三个部分:核 0 进行整体的初始化、唤醒其他核、其他核自身的初始化。

整体初始化阶段,OS 需要初始化内存、PLIC 和共用的串口外设。在完成初始化后,核 0 通过调用 sbi 提供的接口,向另外三个核发送 IPI,通过 SBI 转为 M 态软件中断来唤醒它们。

其他核被唤醒后,进入相同的内核初始化函数,并根据其 id 进入核自身的初始化部分,设置自己的寄存器并配置对应自己的 PLIC 上下文。

简略的内核初始化函数如下:

#![allow(unused)] fn main() { pub fn rust_main(hart_id: usize) -> ! { if hart_id == 0 { // 全局初始化 核0初始化 // 唤醒其他核 for i in 1..CPU_NUM { let mask: usize = 1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3